package com.hdl.design.pattern.engine.facade;

import com.hdl.design.pattern.engine.strategy.req.JsonReqDataStrategy;
import com.hdl.design.pattern.engine.strategy.req.ReqDataContext;
import com.hdl.design.pattern.engine.strategy.req.XmlReqDataStrategy;

import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 类名 ReqDataToMapFacade
 * 描述 将请求流式数据转化为Map的Facade
 * 对外只需要了解类的接口即可，不需要再去转JSON,失败后再转XML
 *
 * @author hedonglin
 * @version 1.0
 * @date 2019/9/25 14:51
 */
public class ReqDataToMapFacade {
    /**
     * JSON字符串数据转化为Map的策略上下文
     */
    private ReqDataContext jsonReqDataContext;
    /**
     * XML字符串数据转化为Map的策略上下文
     */
    private ReqDataContext xmlReqDataContext;

    /**
     * 是否是Json的标志
     */
    private AtomicBoolean isJson = new AtomicBoolean(false);
    /**
     * 是否是Xml的标志
     */
    private AtomicBoolean isXml = new AtomicBoolean(false);

    /**
     * Facade构造函数
     */
    public ReqDataToMapFacade() {
        jsonReqDataContext = new ReqDataContext(new JsonReqDataStrategy());
        xmlReqDataContext = new ReqDataContext(new XmlReqDataStrategy());
    }

    /**
     * 方法描述: Facade提供一个将请求数据转化为Map的功能
     *
     * @param msg 请求数据
     * @return {@link Map} Map
     * @author hedonglin
     * @date 2019/9/25 15:10
     */
    public Map<String, Object> reqDataToMap(String msg) {
        // 先将JSON数据转换为Map
        Map<String, Object> map = jsonReqDataContext.context(msg);
        if (map != null) {
            // 设置为是json
            isJson.set(true);
            return map;
        }
        // 转换不成功，则将XML数据转化为Map
        map = xmlReqDataContext.context(msg);
        if (map != null) {
            // 设置为是xml
            isXml.set(true);
            return map;
        }

        return map;
    }

    /**
     * 方法描述: 将返回的XMl转化为String
     * @param resMap 返回的Map
     * @author hedonglin
     * @date 2019/9/25 16:47
     * @return {@link String}返回的XML/JSON流
    */
    public String mapToStr(Map<String, Object> resMap){
        if (isJson.get()){
            // 转化为JSON
            System.out.println("将Map转化为JSON字符串");
        }else if (isXml.get()){
            // 转化为XML
            System.out.println("将Map转化为XML字符串");
        }

        return "";
    }
}
